SPB Git forge

spb/immbot-ai

Public
1commits 1branches 0releases
1.5 MBsize
maindefault branch
20 days agolast push
TypeScript 98.3% CSS 0.9% Shell 0.7%
2.2 KB · 46 lines typescript
Raw Blame History
1// Embranchement : duplique la conversation jusqu'à un message donné.2import { NextResponse } from "next/server";3import { z } from "zod";4import { apiError, parseBody } from "@/lib/api.ts";5import { assertSameOrigin, requireUser } from "@/lib/auth/session.ts";6import { all, get, run, transaction } from "@/lib/db/index.ts";78const schema = z.object({ upToMessageId: z.number().int().positive() });910export async function POST(req: Request, ctx: { params: Promise<{ id: string }> }) {11  try {12    await assertSameOrigin();13    const user = await requireUser();14    const id = parseInt((await ctx.params).id, 10);15    const conv = get<{ id: number; title: string; course_code: string | null; mode: string; knowledge_mode: string; model: string }>(16      "SELECT id, title, course_code, mode, knowledge_mode, model FROM conversations WHERE id = ? AND user_id = ?",17      id, user.id18    );19    if (!conv) return NextResponse.json({ error: "Conversation introuvable." }, { status: 404 });20    const { upToMessageId } = await parseBody(req, schema);2122    const newId = transaction(() => {23      const r = run(24        `INSERT INTO conversations (user_id, course_code, title, mode, knowledge_mode, model, parent_conversation_id, branched_from_message_id)25         VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,26        user.id, conv.course_code, conv.title + " (branche)", conv.mode, conv.knowledge_mode, conv.model, conv.id, upToMessageId27      );28      const nid = Number(r.lastInsertRowid);29      const msgs = all<{ role: string; content: string; citations: string; attachments: string; model: string; mode: string; knowledge_mode: string }>(30        "SELECT role, content, citations, attachments, model, mode, knowledge_mode FROM messages WHERE conversation_id = ? AND id <= ? ORDER BY id",31        conv.id, upToMessageId32      );33      for (const m of msgs) {34        run(35          "INSERT INTO messages (conversation_id, role, content, citations, attachments, model, mode, knowledge_mode) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",36          nid, m.role, m.content, m.citations, m.attachments, m.model, m.mode, m.knowledge_mode37        );38      }39      return nid;40    });41    return NextResponse.json({ ok: true, conversationId: newId });42  } catch (e) {43    return apiError(e);44  }45}46